package main;

import controller.FileLoadController;
import view.UebungListView;
import model.XMLLoadModel;
import controller.XMLLoadController;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

/**
 * Klasse zur Verwaltung des Hauptfensters des Programmes.<br>
 * Kuemmert sich um die Intanzierung des Fensterinhaltes sowie fuer das Programm benoetigte Model-, View- und Controllerklassen.
 * 
 * @author Patrick Bauer
 */
public class MainWindow extends JFrame {
    /**
     * Der Button zum Laden der XML-Uebersichts Datei.
     */
    private JButton loadXMLButton;
    
    /**
     * Button zum Herunterladen von ausgewaehlten Dateien.
     */
    private JButton loadFilesButton;
    
    /**
     * Scrollpanel zur Anzeige der Uebungsuebersicht
     */
    private UebungListView uebungListView;
    
    /**
     * Initialisiert Klassen-Attribute mit Standardwerten und ruft Funktionen zum instanzieren der MVC-Klassen sowie der Fensterinhalte auf.
     */
    public MainWindow() {
        this.loadXMLButton = new JButton("Aufgaben laden");
        this.loadFilesButton = new JButton("Dateien herunterladen");
        this.uebungListView = new UebungListView();
        
        this.createMVC();
        this.addElements();
    }

    /**
     * Setzt Standardwerte zur Anzeige eines Fensters und zeigt es anschliessend an.
     */
    public void showWindow() {
        this.setTitle("Aufgaben Downloader");
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.pack();
        this.setMinimumSize(this.getSize());
        this.setVisible(true);
    }

    /**
     * Setzt die entsprechenen Layouts und Fensterinhalte in das Hauptfenster.
     */
    private void addElements() {
        //layout
        this.setLayout(new BoxLayout(this.getContentPane(), BoxLayout.Y_AXIS));

        //scrollarea
        this.uebungListView.setPreferredSize(new Dimension(200, 450));
        this.uebungListView.setMinimumSize(new Dimension(200, 450));

        //buttonarea
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout());
        buttonPanel.setMaximumSize(new Dimension(10000000, 1));

        //buttons
        JButton exitButton = new JButton("Beenden");
        exitButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SwingUtilities.getWindowAncestor((JButton )e.getSource()).dispose();
            }
        });
        
        //add buttons to buttonarea
        buttonPanel.add(loadXMLButton);
        buttonPanel.add(loadFilesButton);
        buttonPanel.add(exitButton);

        //add areas to canvas
        this.add(uebungListView);
        this.add(buttonPanel);
    }

    /**
     * Instanziert und Verbindet die fuer das Programm benoetigten Model-, View- und Controllerklassen
     */
    private void createMVC() {
        //model
        XMLLoadModel xmlLoadModel = new XMLLoadModel();
        xmlLoadModel.addObserver(this.uebungListView);
        
        //controller
        XMLLoadController xmlLoadController = new XMLLoadController(xmlLoadModel);
        this.loadXMLButton.addActionListener(xmlLoadController);
        
        FileLoadController fileLoadController = new FileLoadController();
        fileLoadController.setView(this.uebungListView);
        this.loadFilesButton.addActionListener(fileLoadController);
    }
}
